//
//  Element3D_FixedPoints.hpp
//  C3W_Demo_By_Fan
//
//  Created by 范静涛 on 2024/7/23.
//

//------------------------------------------------------------------------------
//【文件名】Element3D_FixedPoints.hpp
//【功能模块和目的】固定点数量的三维基元类声明
//【开发者及日期】范静涛 2024/7/23
//【更改记录】
//------------------------------------------------------------------------------

#ifndef Element3D_FixedPoints_hpp
#define Element3D_FixedPoints_hpp

//Element3D基类所属头文件
#include "Element3D.hpp"
//size_t所属头文件
#include <cstddef>
//std异常基类所属头文件
#include <stdexcept>
//std::vector所属头文件
#include <vector>

//------------------------------------------------------------------------------
//【类名】Element3D_FixedPoints
//【功能】固定点数量的三维基元类(若干非重复三维点构成)
//【接口说明】
//    继承得到基类所有接口
//    默认构造函数
//    带参数构造函数
//    拷贝构造函数
//    赋值运算符overload
//    虚析构函数（可能做基类）
//    求面积接口，纯虚函数(从概念出发，因存在的对象行为)
//    求长度接口，纯虚函数(从概念出发，因存在的对象行为)
//    派生类接口：按规则添加点(从概念出发，因存在的对象行为)
//    派生类接口：按规则修改点(从概念出发，因存在的对象行为)
//    派生类接口：按规则删除点(从概念出发，因存在的对象行为)
//    派生类接口：按规则清空基元(从概念出发，因存在的对象行为)
//【开发者及日期】 范静涛 2024/7/23
//【更改记录】
//------------------------------------------------------------------------------
class Element3D_FixedPoints : public Element3D{
public:
    //--------------------------------------------------------------------------
    //内嵌异常类
    //--------------------------------------------------------------------------
    //两数量点数量不等基元赋值，需抛出此异常
    class COUNT_IS_DIFFERENT : public std::invalid_argument{
    public:
        COUNT_IS_DIFFERENT();
    };
    //试图修改基元点数量，需抛出此异常
    class POINT_COUNT_IS_FIXED : public std::logic_error{
    public:
        POINT_COUNT_IS_FIXED();
    };
    //--------------------------------------------------------------------------
    //必要的构造、析构、赋值行为
    //--------------------------------------------------------------------------
    //默认构造函数
    Element3D_FixedPoints(const std::vector<Point3D>& InitList,
                          size_t MaxPointCount);
    //拷贝构造函数
    Element3D_FixedPoints(const Element3D_FixedPoints& Source);
    //赋值运算符overload
    Element3D_FixedPoints& operator=(const Element3D_FixedPoints& Source);
    //虚析构函数（可能做基类），无动态构造成员，默认实现
    virtual ~Element3D_FixedPoints() = default;
    //--------------------------------------------------------------------------
    //非静态Getter成员函数：需检查所有Getter是否有后置const
    //--------------------------------------------------------------------------
    //求面积接口，重声明无法实现的纯虚函数
    virtual double Area() const override = 0 ;
    //求长度接口，重声明无法实现的纯虚函数
    virtual double Length() const override = 0;
protected:
    //--------------------------------------------------------------------------
    //受保护 非静态Setter成员函数
    //--------------------------------------------------------------------------
    //按规则添加点override
    void AppendPointByRule(const Point3D& APoint) override;
    //按规则删除点override
    void RemovePointByRule(const Point3D& APoint) override;
    //按规则清空基元override
    void ClearByRule() override;
};

#endif /* Element3D_FixedPoints_hpp */
